package com.jinke.uang.ui.fragment;

import android.os.Bundle;

import com.jinke.uang.base.BaseActivity;
import com.jinke.uang.base.BasePersenter;
import com.jinke.uang.interfaces.ICommonModule;
import com.jinke.uang.interfaces.ICommonView;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

/**
 * 基本的fragment  这个是根据 setUserVisibleHint 这个方法来的 但是v4包中的fragment的这个方法有点问题 不回调 所以用另一个
 */
public abstract class BaseNewFragment<P extends BasePersenter, M> extends Fragment implements ICommonView {

    /**
     * 是否初始化完毕
     */
    private boolean isPrepared;

    /**
     * 是否第一次调用onResume()
     */
    private boolean isFirstResume = true;

    public P mPresenter;
    public M mModule;

    // private boolean hasLoadData = false; // 是否已加载数据


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = getPresenter();
        mModule = getModule();
        if (mPresenter != null && mModule != null) mPresenter.attach((ICommonModule) mModule, this);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initPrepare(savedInstanceState);
    }

    /**
     * fragment可见状态发生变化时的回调。处理一些UI变化等？
     *
     * @param isVisible true  不可见 -> 可见
     *                  false 可见  -> 不可见
     */
    protected void onFragmentVisibleChange(boolean isVisible) {

    }

    /**
     * 在fragment首次可见时回调，可在这里进行加载数据，
     * 用hasLoadData保证只在Fragment第一次可见时才会加载数据，
     * 这样就可以防止每次进入都重复加载数据
     */
    protected void loadData() {

    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        // setUserVisibleHint在初始化Fragment的时候也会调用，且在onCreateView之前，所以mView会为null
        // mView是否初始化标志，防止回调函数在mView为空的时候触发
//        if (!hasLoadData && isVisibleToUser) {
//            loadData();
//            hasLoadData = true;
//        }
//
//        onFragmentVisibleChange(isVisibleToUser);

    }

    @Override
    public void onResume() {
        super.onResume();
        if (isFirstResume) {
            isFirstResume = false;
            return;
        }
        if (!isHidden()) {
            onFragmentResume();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (!isHidden()) {
            onFragmentPause();
        }
    }

    protected abstract P getPresenter();

    protected abstract M getModule();

    /**
     * 当前fragment显示状态发生改变时执行的方法 隐藏是 hidden值为true
     */
    @Override
    public void onHiddenChanged(boolean hidden) {
        if (!hidden) {
            onFragmentResume();
        } else {
            onFragmentPause();
        }
        super.onHiddenChanged(hidden);
    }


    private synchronized void initPrepare(Bundle savedInstanceState) {
        if (!isPrepared) {
            onFirstVisible(savedInstanceState);
            onFragmentResume();
        } else {
            isPrepared = true;
        }
    }


    /**
     * 第一次fragment不可见（不建议在此处理事件）
     */
    public void onFirstInvisible() {
    }


    /**
     * 第一次fragment可见（进行初始化工作）
     *
     * @param savedInstanceState
     */
    public void onFirstVisible(Bundle savedInstanceState) {

    }

    /**
     * fragment可见（切换回来或者onResume）
     */
    public void onFragmentResume() {
    }

    /**
     * fragment不可见（切换掉或者onPause）
     */
    public void onFragmentPause() {
    }

    protected void showLoadingView() {
        if (getActivity() == null || !(getActivity() instanceof BaseActivity)) return;
        ((BaseActivity) getActivity()).showLoadingView();
    }

    protected void dismissLoadingView() {
        if (getActivity() == null || !(getActivity() instanceof BaseActivity)) return;
        ((BaseActivity) getActivity()).dismissLoadingView();
    }

    /**
     * 通过资源id 获取字符串
     *
     * @param strResourceId
     * @return
     */
    protected String getStringResource(int strResourceId) {
        return getResources().getString(strResourceId);
    }

}
